{"componentChunkName":"component---src-templates-blog-post-js","path":"/Address-Search-With-React-and-Mapbox-API/","result":{"data":{"site":{"siteMetadata":{"title":"Aleks Popovic - personal website and blog"}},"markdownRemark":{"id":"ac3536a7-76ca-5014-beb9-10e5ad01e132","excerpt":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you. To set up this project you will need to get a…","html":"<p>If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you.</p>\n<p>To set up this project you will need to get a Mapbox API key, or token, as they call it, from their <a href=\"https://www.mapbox.com/\" target=\"_blank\" rel=\"noreferrer\">official website</a>. You can get started for free and use the API up to a limit, which is pretty generous, at least for a prototype app. You will have up to 100,000 free Search API requests (used for address search and autocomplete suggestions) and up to 50,000 free Map API requests (used for loading/generating a map of the selected location), after which you will have to pay to continue using the service. For this reason you will be asked to enter your credit card details in order to be able to get your API key, so be prepared for that.</p>\n<p>If you would prefer a video version of this tutorial you can watch me build the Address Search app with React and Mapbox on Youtube:</p>\n<div class=\"gatsby-resp-iframe-wrapper\" style=\"padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem\" > <iframe src=\"https://www.youtube.com/embed/sxH5Qpd06uY\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen style=\" position: absolute; top: 0; left: 0; width: 100%; height: 100%; \"></iframe> </div>\n<p>I started a new React app through <a href=\"https://vitejs.dev/\" target=\"_blank\" rel=\"noreferrer\">Vite</a> by running:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">yarn</span> create vite</code></pre></div>\n<p>If you don’t use yarn you can find detailed scaffolding instructions on <a href=\"https://vitejs.dev/guide/#scaffolding-your-first-vite-project\" target=\"_blank\" rel=\"noreferrer\">Vite’s Getting Started page</a>.</p>\n<p>For this project we are going to use several additional packages - axios, mapbox-gl, react-map-gl and sass. Axios is going to be used for fetching the autocomplete suggestions and isn’t necessary if you don’t want to use it. Sass is optional as well. I use it as a personal preference, but you can do the whole project with vanila CSS if you want to, just make sure to adjust your selectors accordingly. To install all of them run:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> axios mapbox-gl react-map-gl sass</code></pre></div>\n<p>or</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> <span class=\"token function\">install</span> axios mapbox-gl react-map-gl sass</code></pre></div>\n<p>I am also going to use an image for the map pin, or marker, which you can grab <a href=\"https://github.com/alekspopovic/mapbox-geocoding/blob/main/src/assets/pointer.svg\" target=\"_blank\" rel=\"noreferrer\">from my GitHub repo</a> if you want to use the same one. Make sure to put it in your <code class=\"language-text\">/src/assets</code> folder.</p>\n<p>Final peace of setup that you need to do before continuing is configuring your environment variable. If you are working with Vite like me you need to create a new file called <code class=\"language-text\">.env.local</code> in your project’s root and add this property to it.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token constant\">VITE_TOKEN</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"YOUR_MAPBOX_TOKEN\"</span></code></pre></div>\n<p>Make sure to replace the string with your actual Mapbox token. Your variable need to be prefixed with <code class=\"language-text\">VITE_</code>, so make sure to not remove that part. Bare in mind that this will make your token visible in the client if you intend to publish this app somewhere, or add this functionality to your existing web app. To prevent the misuse of your token Mapbox has in place a couple of options, such as limiting the scope of functionalities that can be accessed with the token, and also restricting the token use to a specific URL. As the safest option you can choose to handle all of the API stuff in the backend, which is out of the scope of this tutorial. After you have your token in place we can proceed with creating components.</p>\n<p>To start off I made a new folder called <code class=\"language-text\">components</code> and in there I added three new components called <code class=\"language-text\">AddressForm.jsx</code>, <code class=\"language-text\">AutoCompleteInput.jsx</code> and <code class=\"language-text\">Map.jsx</code>. Each component has its own <code class=\"language-text\">.scss</code> file with the same name and I’ve put all of them in a new folder called <code class=\"language-text\">styles</code>.  To being I’ve imported <code class=\"language-text\">AddressForm</code> and <code class=\"language-text\">Map</code> components into <code class=\"language-text\">App.jsx</code>, and added some simple state handling. Here is what the <code class=\"language-text\">App.jsx</code> looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// App.js</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"./App.scss\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> AddressForm <span class=\"token keyword\">from</span> <span class=\"token string\">\"./components/AddressForm\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Map <span class=\"token keyword\">from</span> <span class=\"token string\">\"./components/Map\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"mapbox-gl/dist/mapbox-gl.css\"</span><span class=\"token punctuation\">;</span> \n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>address<span class=\"token punctuation\">,</span> setAddress<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    streetAndNumber<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    place<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    region<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    postcode<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    country<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    latitude<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n    longitude<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleFormSubmit</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    event<span class=\"token punctuation\">.</span><span class=\"token function\">preventDefault</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>address<span class=\"token punctuation\">.</span>streetAndNumber<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Selected address:\"</span><span class=\"token punctuation\">,</span> address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">updateCoordinates</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">latitude<span class=\"token punctuation\">,</span> longitude</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setAddress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>address<span class=\"token punctuation\">,</span> latitude<span class=\"token punctuation\">,</span> longitude <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>App<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">AddressForm</span></span>\n        <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleFormSubmit<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">address</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">setAddress</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>setAddress<span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>longitude <span class=\"token operator\">&amp;&amp;</span> address<span class=\"token punctuation\">.</span>latitude <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Map</span></span>\n          <span class=\"token attr-name\">longitude</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>longitude<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">latitude</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>latitude<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">updateCoordinates</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>updateCoordinates<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span>\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Don’t forget to import <code class=\"language-text\">mapbox-gl/dist/mapbox-gl.css</code>, as this is additional styling required for the map to render properly.</p>\n<p>We are setting our state to an object which contains all of the address properties we will be getting from the API, and we are initializing them to an empty value.</p>\n<p>The <code class=\"language-text\">handleFormSubmit</code> is an optional function which you can skip if you don’t need it. We are using it to confirm our final address has been set after selecting one of the autocomplete suggestions and submitting the form, but also after manually changing one of the inputs and then submitting.</p>\n<p>In case you want to manually adjust the map marker position in the end, and consequently the final map coordinates - we will use the <code class=\"language-text\">updateCoordinates</code> function which keeps the old state and changes just the latitude and longitude.</p>\n<p>We will display the <code class=\"language-text\">Map</code> component conditionally, only if we have the address coordinates in place. We are also passing in several props to both components.</p>\n<p>Here is what the <code class=\"language-text\">AddressForm</code> component looks like.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// AddressForm.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/AddressForm.scss\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> AutoCompleteInput <span class=\"token keyword\">from</span> <span class=\"token string\">\"./AutoCompleteInput\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">AddressForm</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> address<span class=\"token punctuation\">,</span> onSubmit<span class=\"token punctuation\">,</span> setAddress <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleManualInputChange</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event<span class=\"token punctuation\">,</span> stateProperty</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> newAddress <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>address <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    newAddress<span class=\"token punctuation\">[</span>stateProperty<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">setAddress</span><span class=\"token punctuation\">(</span>newAddress<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>form<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onSubmit</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>onSubmit<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">htmlFor</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>address<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Address</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">AutoCompleteInput</span></span>\n        <span class=\"token attr-name\">setAddress</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>setAddress<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">handleManualInputChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleManualInputChange<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">streetAndNumber</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>streetAndNumber<span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">htmlFor</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>city<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">City</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n        <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>city<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>City<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>place<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleManualInputChange</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token string\">\"place\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">htmlFor</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>state<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">State/Province/Region</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n        <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>state<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>State/Province/Region<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>region<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleManualInputChange</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token string\">\"region\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">htmlFor</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>postcode<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Postcode</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n        <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>postcode<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Postcode<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>postcode<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleManualInputChange</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token string\">\"postcode\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>label</span> <span class=\"token attr-name\">htmlFor</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>country<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Country</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>label</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n        <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>country<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Country<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>address<span class=\"token punctuation\">.</span>country<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleManualInputChange</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token string\">\"country\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>buttons<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>confirm-button<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          Confirm\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>reset<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>reset-button<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n            <span class=\"token function\">setAddress</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n              streetAndNumber<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n              place<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n              region<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n              postcode<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n              country<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n              latitude<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n              longitude<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          Reset\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It looks big, but it’s mostly just a form with several input fields and their labels. We are also importing our <code class=\"language-text\">AutoCompleteInput</code> which we will implement next. </p>\n<p>All inputs have an <code class=\"language-text\">onChange</code> event which calls our <code class=\"language-text\">handleManualInputChange</code> function which takes in the property name that needs to be manually changed in our state and sets it to the input’s value. We are also passing in this function as a prop to the <code class=\"language-text\">AutoCompleteInput</code> component which will also implement it.</p>\n<p>There is also a <code class=\"language-text\">reset</code> button which just resets our address state to our default object with empty address properties. We can now continue with setting up the <code class=\"language-text\">AutoCompleteInput</code> component which looks like this.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">//AutoCompleteInput.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/AutoCompleteInput.scss\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> getPlaces <span class=\"token keyword\">from</span> <span class=\"token string\">\"../API/getPlaces\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">AutoCompleteInput</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>\n  handleManualInputChange<span class=\"token punctuation\">,</span>\n  setAddress<span class=\"token punctuation\">,</span>\n  streetAndNumber<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>suggestions<span class=\"token punctuation\">,</span> setSuggestions<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleChange</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">handleManualInputChange</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> <span class=\"token string\">\"streetAndNumber\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">handleInputChange</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleInputChange</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">query</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> suggesions <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">getPlaces</span><span class=\"token punctuation\">(</span>query<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setSuggestions</span><span class=\"token punctuation\">(</span>suggesions<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleSuggestionClick</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">suggestion</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> streetAndNumber <span class=\"token operator\">=</span> suggestion<span class=\"token punctuation\">.</span>place_name<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\",\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> latitude <span class=\"token operator\">=</span> suggestion<span class=\"token punctuation\">.</span>center<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> longitude <span class=\"token operator\">=</span> suggestion<span class=\"token punctuation\">.</span>center<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> address <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      streetAndNumber<span class=\"token punctuation\">,</span>\n      place<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      region<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      postcode<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      country<span class=\"token operator\">:</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span>\n      latitude<span class=\"token punctuation\">,</span>\n      longitude<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n    suggestion<span class=\"token punctuation\">.</span>context<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> identifier <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">.</span><span class=\"token function\">split</span><span class=\"token punctuation\">(</span><span class=\"token string\">\".\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n      address<span class=\"token punctuation\">[</span>identifier<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">setAddress</span><span class=\"token punctuation\">(</span>address<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">setSuggestions</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>autoCompleteInputContainer<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n          <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>address<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>text<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">placeholder</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>Address<span class=\"token punctuation\">\"</span></span>\n          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>streetAndNumber<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleChange<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>addressSuggestions<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token punctuation\">{</span>suggestions<span class=\"token operator\">?.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">suggestion<span class=\"token punctuation\">,</span> index</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span> <span class=\"token attr-name\">key</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>index<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">handleSuggestionClick</span><span class=\"token punctuation\">(</span>suggestion<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n              </span><span class=\"token punctuation\">{</span>suggestion<span class=\"token punctuation\">.</span>place_name<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We have an input which implements our <code class=\"language-text\">handleManualInputChange</code> function, but also calls our <code class=\"language-text\">getPlaces</code> function which we will use to fetch the address suggestions, which we will then store with <code class=\"language-text\">useState</code>. We will map out every suggestion in a list below the input and assign to each of them an <code class=\"language-text\">onClick</code> event which will handle getting all of the address properties from that suggestion and storing our newly selected address in state.</p>\n<p>To get the <code class=\"language-text\">streetAndNumber</code> we need to split <code class=\"language-text\">suggestion.place_name</code> property over a comma, because only the first part before the comma is the actual street name and the address number.</p>\n<p>Latitude and longitude are stored in <code class=\"language-text\">suggestion.center</code> property which is an array with just those two values.</p>\n<p>Rest of the properties we need to extract from <code class=\"language-text\">suggestion.context</code> property, which is an array of objects which have two properties inside - <code class=\"language-text\">id</code> and <code class=\"language-text\">text</code>. The <code class=\"language-text\">id</code> has values which correspond to our address property names, but they also have a dot followed buy a three digit number. For example, an <code class=\"language-text\">id</code> might have values such as <code class=\"language-text\">place.346</code>, or <code class=\"language-text\">country.834</code>, or <code class=\"language-text\">region.772</code>. That’s why we are splitting this value over the <code class=\"language-text\">.</code> and taking the first value, which is our property name. Then we are setting that property name in our state to the <code class=\"language-text\">text</code> value, which is our actual country, city etc.</p>\n<p>Once all of the existing properties are set we update our address state, and clear our suggestions state.</p>\n<p>In order for this to work we must now implement our <code class=\"language-text\">getPlaces</code> function which will fetch our addresses.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// getPlaces.js</span>\n\n<span class=\"token keyword\">import</span> axios <span class=\"token keyword\">from</span> <span class=\"token string\">\"axios\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getPlaces</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">query</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> axios<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>\n      <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://api.mapbox.com/geocoding/v5/mapbox.places/</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>query<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.json</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span>\n        params<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          access_token<span class=\"token operator\">:</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">.</span>meta<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VITE_TOKEN</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> response<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>features<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"There was an error while fetching places:\"</span><span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>We are using the value from the input as our query value that will be searched through the API call. We also need to pass in our <code class=\"language-text\">access_token</code> as a parameter, and return <code class=\"language-text\">response.data.features</code> property, which is a list of our matching addresses. If there is an error we handle it in the <code class=\"language-text\">catch</code> block.</p>\n<p>If you go back and start typing into the <code class=\"language-text\">AutoCompleteInput</code> you should get back suggestions from the API, and if you click on one of them it should get stored in our state. But, we still have one more step, and that is generating a map that points to our selected address, so let’s implement our <code class=\"language-text\">Map</code> component.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// Map.jsx</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles/Map.scss\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PointerIcon <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/pointer.svg\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ReactMapGl<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Marker <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react-map-gl\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState<span class=\"token punctuation\">,</span> useEffect <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token constant\">TOKEN</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">import</span><span class=\"token punctuation\">.</span>meta<span class=\"token punctuation\">.</span>env<span class=\"token punctuation\">.</span><span class=\"token constant\">VITE_TOKEN</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> longitude<span class=\"token punctuation\">,</span> latitude<span class=\"token punctuation\">,</span> updateCoordinates <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>viewport<span class=\"token punctuation\">,</span> setViewport<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    latitude<span class=\"token punctuation\">,</span>\n    longitude<span class=\"token punctuation\">,</span>\n    zoom<span class=\"token operator\">:</span> <span class=\"token number\">16</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>marker<span class=\"token punctuation\">,</span> setMarker<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    latitude<span class=\"token punctuation\">,</span>\n    longitude<span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setViewport</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">oldViewport</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token operator\">...</span>oldViewport<span class=\"token punctuation\">,</span>\n      latitude<span class=\"token punctuation\">,</span>\n      longitude<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>latitude<span class=\"token punctuation\">,</span> longitude<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">handleMarkerDrag</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> latitude <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>lngLat<span class=\"token punctuation\">.</span>lat<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> longitude <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>lngLat<span class=\"token punctuation\">.</span>lng<span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">setMarker</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> latitude<span class=\"token punctuation\">,</span> longitude <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">updateCoordinates</span><span class=\"token punctuation\">(</span>latitude<span class=\"token punctuation\">,</span> longitude<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>map<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ReactMapGl</span></span>\n        <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">viewport</span><span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">mapboxAccessToken</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token constant\">TOKEN</span><span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">map</span><span class=\"token style-attr language-css\"><span class=\"token attr-name\"><span class=\"token attr-name\">Style</span></span><span class=\"token punctuation\">=\"</span><span class=\"token attr-value\"><span class=\"token property\">mapbox</span><span class=\"token punctuation\">:</span>//styles/mapbox/streets-v12</span><span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">onMove</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          <span class=\"token function\">setViewport</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>viewState<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Marker</span></span>\n          <span class=\"token attr-name\">latitude</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>marker<span class=\"token punctuation\">.</span>latitude<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">longitude</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>marker<span class=\"token punctuation\">.</span>longitude<span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">draggable</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span></span>\n          <span class=\"token attr-name\">onDragEnd</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleMarkerDrag<span class=\"token punctuation\">}</span></span>\n        <span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n          </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>marker<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">src</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>PointerIcon<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Marker</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">ReactMapGl</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Map<span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">Viewport</code> is a configuration object for the <code class=\"language-text\">ReactMapGl</code> component. At it’s most basic setting it should contain at least your <code class=\"language-text\">latitude</code> and <code class=\"language-text\">longitude</code> so it knows where to center the map view. If you remember, we are rendering our <code class=\"language-text\">Map</code> component conditionally only if there are existing coordinates in our state, so the default state values for <code class=\"language-text\">viewport</code> should be properly handled through our props. The <code class=\"language-text\">zoom</code> property handles the zoom level of the map, which you might adjust based on your preferences and use-case.</p>\n<p>We are also handling marker coordinates in a separate state. You don’t necessarily need to do this, but depending on if you want to handle your viewport and marker separately you might want to.</p>\n<p>In order to generate the map we must use the <code class=\"language-text\">mapboxAccessToken</code> prop in <code class=\"language-text\">ReactMapGl</code> and set its value to our Mapbox token. The <code class=\"language-text\">mapStyle</code> prop determines the look and style of the map, and if you want to use a different map type you can find other values in Mapbox’s documentation on their website. </p>\n<p>The <code class=\"language-text\">onMove</code> prop handles the panning or dragging of the map. The event that gets automatically passed to us has a <code class=\"language-text\">viewState</code> property which we can use to set our <code class=\"language-text\">viewport</code> to our new value which will re-center the map to that point.</p>\n<p>Inside of <code class=\"language-text\">ReactMapGl</code> component we are adding the <code class=\"language-text\">Marker</code> component. Both of these are a part of the <code class=\"language-text\">react-map-gl</code> package. Marker has props for longitude and latitude which determine its position. We are also setting its <code class=\"language-text\">draggable</code> prop to <code class=\"language-text\">true</code>, so it can be dragged, and <code class=\"language-text\">onDragEnd</code> is the prop which handles what happens when we are done dragging the marker, so we are passing our <code class=\"language-text\">handleMarkerDrag</code> function to it. This function updates our marker’s coordinates, and also our address coordinates, which will update the viewport and re-center our map to marker’s new location. If you don’t want for your map to move with the marker you would implement that part a bit differently.</p>\n<p>Inside of the <code class=\"language-text\">Marker</code> we are adding an <code class=\"language-text\">img</code> element which uses our <code class=\"language-text\">PointerIcon</code> as its <code class=\"language-text\">src</code>. The <code class=\"language-text\">Marker</code> handles the marker’s behaviour, and the <code class=\"language-text\">img</code> handles the marker’s look.</p>\n<p>That’s it as far as our functionalities go. If you want to style the app the same way I did you can use the following code. Make sure to put all of these files in your styles folder, except for the <code class=\"language-text\">App.scss</code>. I won’t go through them in detail as we are mainly just setting up some colors, centering things, and adding some additional space in the form of margins and paddings. If you are using vanila CSS for this just change your file extensions to <code class=\"language-text\">.css</code> and adjust the selectors accordingly.</p>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// App.scss</span>\n\n<span class=\"token keyword\">@import</span> <span class=\"token url\">url</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"https://fonts.googleapis.com/css2?family=Poppins&amp;display=swap\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token selector\">body </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">background</span><span class=\"token punctuation\">:</span> <span class=\"token function\">linear-gradient</span><span class=\"token punctuation\">(</span>30deg<span class=\"token punctuation\">,</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 39<span class=\"token punctuation\">,</span> 65<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 91<span class=\"token punctuation\">,</span> 151<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Poppins\"</span><span class=\"token punctuation\">,</span> sans-serif<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">#root </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 100vh<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">.App </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 1000px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen <span class=\"token operator\">and</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 700px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.App </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">#root </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> start<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// AddressForm.scss</span>\n\n<span class=\"token selector\">.form </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 2em<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin-right</span><span class=\"token punctuation\">:</span> 3em<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">label </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 4px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 100%<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">text-align</span><span class=\"token punctuation\">:</span> left<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">input </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 250px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0.75em<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 0.5em<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid white<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">border-radius</span><span class=\"token punctuation\">:</span> 4px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Poppins\"</span><span class=\"token punctuation\">,</span> sans-serif<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token selector\">.buttons </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">margin-top</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\">button </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 1em 2em<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">border-radius</span><span class=\"token punctuation\">:</span> 4px<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">cursor</span><span class=\"token punctuation\">:</span> pointer<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Poppins\"</span><span class=\"token punctuation\">,</span> sans-serif<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>0<span class=\"token punctuation\">,</span> 194<span class=\"token punctuation\">,</span> 120<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>.confirm-button </span><span class=\"token punctuation\">{</span>\n        <span class=\"token property\">margin-right</span><span class=\"token punctuation\">:</span> 1em<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>.reset-button </span><span class=\"token punctuation\">{</span>\n        <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>255<span class=\"token punctuation\">,</span> 65<span class=\"token punctuation\">,</span> 43<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// AutoCompleteInput.scss</span>\n\n<span class=\"token selector\">.autoCompleteInputContainer </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> relative<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">.addressSuggestions </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">position</span><span class=\"token punctuation\">:</span> absolute<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">top</span><span class=\"token punctuation\">:</span> 1.75em<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">border</span><span class=\"token punctuation\">:</span> 1px solid black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">overflow</span><span class=\"token punctuation\">:</span> hidden<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">border-radius</span><span class=\"token punctuation\">:</span> 4px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> black<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">z-index</span><span class=\"token punctuation\">:</span> 999<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n\n    <span class=\"token selector\">li </span><span class=\"token punctuation\">{</span>\n      <span class=\"token property\">list-style</span><span class=\"token punctuation\">:</span> none<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">border-bottom</span><span class=\"token punctuation\">:</span> 1px solid black<span class=\"token punctuation\">;</span>\n      <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0.5em 1em<span class=\"token punctuation\">;</span>\n\n      <span class=\"token selector\"><span class=\"token parent important\">&amp;</span>:hover </span><span class=\"token punctuation\">{</span>\n        <span class=\"token property\">background-color</span><span class=\"token punctuation\">:</span> <span class=\"token function\">rgb</span><span class=\"token punctuation\">(</span>22<span class=\"token punctuation\">,</span> 66<span class=\"token punctuation\">,</span> 128<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token property\">color</span><span class=\"token punctuation\">:</span> white<span class=\"token punctuation\">;</span>\n        <span class=\"token property\">cursor</span><span class=\"token punctuation\">:</span> pointer<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"scss\"><pre class=\"language-scss\"><code class=\"language-scss\"><span class=\"token comment\">// Map.scss</span>\n\n<span class=\"token selector\">.map </span><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 400px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 400px<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> auto 0<span class=\"token punctuation\">;</span>\n\n  <span class=\"token selector\">.marker </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">width</span><span class=\"token punctuation\">:</span> 50px<span class=\"token punctuation\">;</span>\n    <span class=\"token property\">height</span><span class=\"token punctuation\">:</span> 50px<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token atrule\"><span class=\"token rule\">@media</span> only screen <span class=\"token operator\">and</span> <span class=\"token punctuation\">(</span><span class=\"token property\">max-width</span><span class=\"token punctuation\">:</span> 700px<span class=\"token punctuation\">)</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token selector\">.map </span><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">margin-bottom</span><span class=\"token punctuation\">:</span> 2em<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>With that our Address Search app with autocomplete and map generation is finished. You can of course expand it with other interesting functionalities. You may want to add debounce or throttling to the <code class=\"language-text\">AutoCompleteInput</code> to prevent fetching the suggestions with each keyboard click. As discussed previously, you should handle the API key and calls in a more secure way if you decide to use this in production. You may also decide to handle the form submit in a better way that suits more to your use-case, instead of just logging the final address. </p>\n<p>If you do end up improving this app send me a message. I would love to see your creations!</p>\n<hr>\n \n<div class=\"sectionHighlight\">If you have any questions or comments you can reach out to me on <a href=\"https://twitter.com/alekswritescode\" target=\"_blank\" rel=\"noopener noreferrer\">Twitter</a> and <a href=\"https://www.instagram.com/aleks.popovic/\" target=\"_blank\" rel=\"noopener noreferrer\">Instagram</a>, where I also post interesting code tidbits and designs.\n \nI also have a <a href=\"https://www.youtube.com/AleksPopovic\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube channel</a> where I regularly upload React and web dev tutorials, so if that's your cup of tea feel free to support me by subscribing.</div>","frontmatter":{"title":"Address Search with React and Mapbox API","series":null,"seriesLink":null,"date":"November 09, 2023","description":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you.","tags":["web","react","API"],"featuredImage":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsSAAALEgHS3X78AAAB80lEQVQY0wHoARf+AEG2pj62pUTCq1rUuHbqyErJrxWhknfpx5H50IT6xH/9xIv9zob8yZP91or4zTvApzO7pjm8pTe2oDa2oAB51L+N48l83cJexrJHsaVFsKQqnJRhwbGK38aH38B9zK59zrB+07CK07d6zbFwp5N3e25FrJg3u6Q4t6EAXsKnd9evf9e2iau0mq28tMHLqLrFfZ2rkbbAi5yTjVJRm11ZpFVRj1lXmWNds3BhnWhbX5GBNMCoObWfAFm+o3XXq226pJSvuJe1vH6jr3idqnCYoom5uX6RhYlkXoNhYYhgXYphX4SAdKaDanOLejiznTi3nzm4oABTvKR1w6mSrbaFpa2FqbRnqZt5nXB/nHWNqXmKqHuLpHagtXmQpXR8pH+Dqn96pns6tZw6u6Q9uaI5uJ8AT7midryqm6y7fpyojKu6hK2Nqq9thJ5vlqVtkqVzp7FytrdtkKp5k695gZ11e5lzMq+TJ7OUNLabPrujAE25mVe2m160pGHArm3Nu2vQtmXDpiOWhkuymXbPrVW2my6Zii6hkDinkjGhkDKlkimxnCaxmyiznDO2oQBOq5RYsZt22rpU2bZgxqFwsowppI4Yoo8epZEhqJQZo5EYopEgqZIjs5Qhs5Mms5UpspQtspc2tp8uspxMjA5WWvA9bgAAAABJRU5ErkJggg==","aspectRatio":2.6666666666666665,"src":"/static/03b6810fd10b370c8aca9660ed18d330/0e6e2/address.png","srcSet":"/static/03b6810fd10b370c8aca9660ed18d330/b460a/address.png 480w,\n/static/03b6810fd10b370c8aca9660ed18d330/6e898/address.png 960w,\n/static/03b6810fd10b370c8aca9660ed18d330/0e6e2/address.png 1920w","srcWebp":"/static/03b6810fd10b370c8aca9660ed18d330/30cf3/address.webp","srcSetWebp":"/static/03b6810fd10b370c8aca9660ed18d330/35871/address.webp 480w,\n/static/03b6810fd10b370c8aca9660ed18d330/fcc10/address.webp 960w,\n/static/03b6810fd10b370c8aca9660ed18d330/30cf3/address.webp 1920w","sizes":"(max-width: 1920px) 100vw, 1920px"}}}}}},"pageContext":{"slug":"/Address-Search-With-React-and-Mapbox-API/","previous":{"excerpt":"I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s…","fields":{"slug":"/Comic-Book-App-With-Marvel-API-and-React/"},"frontmatter":{"date":"November 02, 2023","title":"Comic Book App With Marvel API and React","series":null,"description":"I grew up on both DC and Marvel comic books, cartoons and TV shows. From the 1966 Batman series, to 1967 Spider man cartoons, and 1940s Superman cartoons. Which is sort of ridiculous since I grew up in the 90s, but I guess that's what our TV companies could afford at the time.","tags":["web","react","API"],"featuredImage":{"id":"4bc9cdf5-bdec-5969-b277-f3d1db641a0d","publicURL":"/static/9dc0ca21ac4035a31d6c67333000d87c/marvel.png","relativeDirectory":"Comic-Book-App-With-Marvel-API-and-React","relativePath":"Comic-Book-App-With-Marvel-API-and-React/marvel.png"}}},"next":{"excerpt":"In this tutorial you will learn how to set up a simple, yet pretty customizable star rating component in React. You know those little stars…","fields":{"slug":"/Easy-Customizable-Star-Rating-Component-in-React/"},"frontmatter":{"date":"November 14, 2023","title":"Easy Customizable Star Rating Component in React","series":null,"description":"If you need a quick and simple solution for address search with autocomplete and geocoding this one is for you.","tags":["web","react","component"],"featuredImage":{"id":"662e7074-1655-5b7b-b1b3-41c3277cbb65","publicURL":"/static/3fcc896f07936890607bd46ef93a75e1/rating.png","relativeDirectory":"Easy-Customizable-Star-Rating-Component-in-React","relativePath":"Easy-Customizable-Star-Rating-Component-in-React/rating.png"}}}}}}